/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ruavaennet.manager;

import com.ruavaennet.dataobject.CasillaDataObject;
import com.ruavaennet.dataobject.LetraDataObject;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JOptionPane;

/**
 *
 * @author DBIIS_DEMO
 */
public class CrucigramaManager {

    private CasillaDataObject[][] tablero=null;
    
    private ArrayList<LetraDataObject> bolsaLetrasActual=null;
    
    private HashMap<String,LetraDataObject> mapaLetras = new HashMap<String,LetraDataObject>();
    
    public int colocarLetras(String[][] listaLetras) throws Exception{
        for(int x=0; x<listaLetras.length; x++){
            int i = Integer.parseInt(listaLetras[x][0]);
            int j = Integer.parseInt(listaLetras[x][1]);
            if(this.tablero[i][j].getLetraAsignada()!=null){
                this.tablero[i][j].setLetraAsignada(this.getLetraById(listaLetras[x][2]));
            }else{
                throw new Exception("Casilla ya asignada");
            }
            
        }
        return 0;
    }
    
    public ArrayList<LetraDataObject> getNuevaBolsaLetras(){
        bolsaLetrasActual = new ArrayList<LetraDataObject>();
        
        for(int i=0; i<12; i++){
            bolsaLetrasActual.add(new LetraDataObject("A", null,1,1));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("B", null,3,2));
        bolsaLetrasActual.add(new LetraDataObject("B", null,3,2));
        
        for(int i=0; i<4; i++){
            bolsaLetrasActual.add(new LetraDataObject("C", null,3,3));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("CH", null,5,4));
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("D", null,2,5));
        }
        
        for(int i=0; i<12; i++){
            bolsaLetrasActual.add(new LetraDataObject("E", null,1,6));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("F", null,4,7));
        
        bolsaLetrasActual.add(new LetraDataObject("G", null,2,8));
        bolsaLetrasActual.add(new LetraDataObject("G", null,2,8));
        
        bolsaLetrasActual.add(new LetraDataObject("H", null,4,9));
        bolsaLetrasActual.add(new LetraDataObject("H", null,4,9));
        
        for(int i=0; i<6; i++){
            bolsaLetrasActual.add(new LetraDataObject("I", null,1,10));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("J", null,8,11));
        
        //k no hay
             
        for(int i=0; i<4; i++){
            bolsaLetrasActual.add(new LetraDataObject("L", null,1,12));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("LL", null,8,13));
        
        bolsaLetrasActual.add(new LetraDataObject("M", null,3,14));
        bolsaLetrasActual.add(new LetraDataObject("M", null,3,15));
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("N", null,1,16));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("Ñ", null,8,17));
        
        for(int i=0; i<9; i++){
            bolsaLetrasActual.add(new LetraDataObject("O", null,1,18));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("P", null,3,19));
        bolsaLetrasActual.add(new LetraDataObject("P", null,3,19));
        
        bolsaLetrasActual.add(new LetraDataObject("Q", null,5,20));
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("R", null,1,21));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("RR", null,8,22));
        
        for(int i=0; i<6; i++){
            bolsaLetrasActual.add(new LetraDataObject("S", null,1,23));
        }
        
        for(int i=0; i<4; i++){
            bolsaLetrasActual.add(new LetraDataObject("T", null,1,24));
        }
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("U", null,1,25));
        }
        
        
        bolsaLetrasActual.add(new LetraDataObject("V", null,4,26));
        
        // w no existe
        bolsaLetrasActual.add(new LetraDataObject("X", null,8,27));
        
        bolsaLetrasActual.add(new LetraDataObject("Y", null,4,28));
        
        bolsaLetrasActual.add(new LetraDataObject("Z", null,8,29));
        
        // Comodines
        bolsaLetrasActual.add(new LetraDataObject("1", null,0,0));
        bolsaLetrasActual.add(new LetraDataObject("1", null,0,0));
        
        mapaLetras.put("1",new LetraDataObject("A", null,1,1));
        mapaLetras.put("2",new LetraDataObject("B", null,3,2));        
        mapaLetras.put("3",new LetraDataObject("C", null,3,3));
        mapaLetras.put("4",new LetraDataObject("CH", null,5,4));
        mapaLetras.put("5",new LetraDataObject("D", null,2,5));
        mapaLetras.put("6",new LetraDataObject("E", null,1,6));
        mapaLetras.put("7",new LetraDataObject("F", null,4,7));
        mapaLetras.put("8",new LetraDataObject("G", null,2,8));
        mapaLetras.put("9",new LetraDataObject("H", null,4,9));
        mapaLetras.put("10",new LetraDataObject("H", null,4,9));
        mapaLetras.put("11",new LetraDataObject("I", null,1,10));
        mapaLetras.put("12",new LetraDataObject("J", null,8,11));             
        mapaLetras.put("13",new LetraDataObject("L", null,1,12));
        mapaLetras.put("14",new LetraDataObject("LL", null,8,13));
        mapaLetras.put("15",new LetraDataObject("M", null,3,14));
        mapaLetras.put("16",new LetraDataObject("N", null,1,16));        
        mapaLetras.put("17",new LetraDataObject("Ñ", null,8,17));
        mapaLetras.put("18",new LetraDataObject("O", null,1,18));
        mapaLetras.put("19",new LetraDataObject("P", null,3,19));
        mapaLetras.put("20",new LetraDataObject("Q", null,5,20));
        mapaLetras.put("21",new LetraDataObject("R", null,1,21));
        mapaLetras.put("22",new LetraDataObject("RR", null,8,22));
        mapaLetras.put("23",new LetraDataObject("S", null,1,23));
        mapaLetras.put("24",new LetraDataObject("T", null,1,24));
        mapaLetras.put("25",new LetraDataObject("U", null,1,25));
        mapaLetras.put("26",new LetraDataObject("V", null,4,26));
        mapaLetras.put("27",new LetraDataObject("X", null,8,27));
        mapaLetras.put("28",new LetraDataObject("Y", null,4,28));
        mapaLetras.put("29",new LetraDataObject("Z", null,8,29));
        //letras comodin sin valor
        mapaLetras.put("-1",new LetraDataObject("A", null,0,-1));
        mapaLetras.put("-2",new LetraDataObject("B", null,0,-2));        
        mapaLetras.put("-3",new LetraDataObject("C", null,0,-3));
        mapaLetras.put("-4",new LetraDataObject("CH", null,0,-4));
        mapaLetras.put("-5",new LetraDataObject("D", null,0,-5));
        mapaLetras.put("-6",new LetraDataObject("E", null,0,-6));
        mapaLetras.put("-7",new LetraDataObject("F", null,0,-7));
        mapaLetras.put("-8",new LetraDataObject("G", null,0,-8));
        mapaLetras.put("-9",new LetraDataObject("H", null,0,-9));
        mapaLetras.put("-10",new LetraDataObject("H", null,0,-9));
        mapaLetras.put("-11",new LetraDataObject("I", null,0,-10));
        mapaLetras.put("-12",new LetraDataObject("J", null,0,-11));             
        mapaLetras.put("-13",new LetraDataObject("L", null,0,-12));
        mapaLetras.put("-14",new LetraDataObject("LL", null,0,-13));
        mapaLetras.put("-15",new LetraDataObject("M", null,0,-14));
        mapaLetras.put("-16",new LetraDataObject("N", null,0,-16));        
        mapaLetras.put("-17",new LetraDataObject("Ñ", null,0,-17));
        mapaLetras.put("-18",new LetraDataObject("O", null,0,-18));
        mapaLetras.put("-19",new LetraDataObject("P", null,0,-19));
        mapaLetras.put("-20",new LetraDataObject("Q", null,0,-20));
        mapaLetras.put("-21",new LetraDataObject("R", null,0,-21));
        mapaLetras.put("-22",new LetraDataObject("RR", null,0,-22));
        mapaLetras.put("-23",new LetraDataObject("S", null,0,-23));
        mapaLetras.put("-24",new LetraDataObject("T", null,0,-24));
        mapaLetras.put("-25",new LetraDataObject("U", null,0,-25));
        mapaLetras.put("-26",new LetraDataObject("V", null,0,-26));
        mapaLetras.put("-27",new LetraDataObject("X", null,0,-27));
        mapaLetras.put("-28",new LetraDataObject("Y", null,0,-28));
        mapaLetras.put("-29",new LetraDataObject("Z", null,0,-29));
        
        return null;
        
    }
    
    public ArrayList<LetraDataObject> getLetrasAleatorias(int nroLetras){
        
        if(this.getBolsaActual().isEmpty()){
            return new ArrayList<LetraDataObject>();
        }
        
        ArrayList<LetraDataObject> lista = new ArrayList<LetraDataObject>();
        
        if(this.getBolsaActual().size()<nroLetras){
            nroLetras = this.getBolsaActual().size();
        }
        
        for(int i=0; i<nroLetras; i++){
            int index = (int)(Math.ceil(Math.random()*(this.getBolsaActual().size()-1)));
            lista.add(this.getBolsaActual().remove(index));    
        }    
        
       
        return lista;
        
    }
    
    private void createTablero() {
        this.tablero = new CasillaDataObject[15][15];
        for(int i=0; i<15; i++){
            for(int j=0; j<15; j++){
                this.tablero[i][j] = new CasillaDataObject();
            }
        }
        
        this.tablero[0][0].setModificador("triplePalabra");
        this.tablero[0][7].setModificador("triplePalabra");
        this.tablero[0][14].setModificador("triplePalabra");
        this.tablero[7][0].setModificador("triplePalabra");
        this.tablero[7][14].setModificador("triplePalabra");
        this.tablero[14][0].setModificador("triplePalabra");
        this.tablero[14][7].setModificador("triplePalabra");
        this.tablero[14][14].setModificador("triplePalabra");
        
        this.tablero[1][5].setModificador("tripleLetra");
        this.tablero[1][9].setModificador("tripleLetra");
        this.tablero[5][1].setModificador("tripleLetra");
        this.tablero[5][5].setModificador("tripleLetra");
        this.tablero[5][9].setModificador("tripleLetra");
        this.tablero[5][13].setModificador("tripleLetra");
        this.tablero[7][1].setModificador("tripleLetra");
        this.tablero[7][5].setModificador("tripleLetra");
        this.tablero[7][9].setModificador("tripleLetra");
        this.tablero[7][13].setModificador("tripleLetra");
        this.tablero[13][5].setModificador("tripleLetra");
        this.tablero[13][9].setModificador("tripleLetra");
        
        this.tablero[1][1].setModificador("doblePalabra");
        this.tablero[2][2].setModificador("doblePalabra");
        this.tablero[3][3].setModificador("doblePalabra");
        this.tablero[4][4].setModificador("doblePalabra");
        this.tablero[1][13].setModificador("doblePalabra");
        this.tablero[2][12].setModificador("doblePalabra");
        this.tablero[3][11].setModificador("doblePalabra");
        this.tablero[4][10].setModificador("doblePalabra");
        this.tablero[7][7].setModificador("doblePalabra");
        this.tablero[10][4].setModificador("doblePalabra");
        this.tablero[11][3].setModificador("doblePalabra");
        this.tablero[12][2].setModificador("doblePalabra");
        this.tablero[13][1].setModificador("doblePalabra");
        this.tablero[10][10].setModificador("doblePalabra");
        this.tablero[11][11].setModificador("doblePalabra");
        this.tablero[12][12].setModificador("doblePalabra");
        this.tablero[13][13].setModificador("doblePalabra");
        
        this.tablero[0][4].setModificador("dobleLetra");
        this.tablero[0][11].setModificador("dobleLetra");
        this.tablero[2][6].setModificador("dobleLetra");
        this.tablero[2][8].setModificador("dobleLetra");
        this.tablero[3][0].setModificador("dobleLetra");
        this.tablero[3][7].setModificador("dobleLetra");
        this.tablero[3][14].setModificador("dobleLetra");
        this.tablero[6][2].setModificador("dobleLetra");
        this.tablero[6][6].setModificador("dobleLetra");
        this.tablero[6][8].setModificador("dobleLetra");
        this.tablero[6][12].setModificador("dobleLetra");
        this.tablero[7][3].setModificador("dobleLetra");
        this.tablero[7][11].setModificador("dobleLetra"); 
        this.tablero[8][2].setModificador("dobleLetra");
        this.tablero[8][6].setModificador("dobleLetra");
        this.tablero[8][8].setModificador("dobleLetra");
        this.tablero[8][12].setModificador("dobleLetra");
        this.tablero[11][0].setModificador("dobleLetra");
        this.tablero[11][7].setModificador("dobleLetra");
        this.tablero[11][14].setModificador("dobleLetra");
        this.tablero[12][6].setModificador("dobleLetra");
        this.tablero[12][8].setModificador("dobleLetra");
        this.tablero[14][3].setModificador("dobleLetra");
        this.tablero[14][11].setModificador("dobleLetra");
          
    }
    
    public ArrayList<LetraDataObject> getBolsaActual() {
        return bolsaLetrasActual;
    }

    public void setBolsaActual(ArrayList<LetraDataObject> bolsaLetrasActual) {
        this.bolsaLetrasActual = bolsaLetrasActual;
    }

    public CasillaDataObject[][] getTablero() {
        return tablero;
    }

    public void setTablero(CasillaDataObject[][] tablero) {
        this.tablero = tablero;
    }
    
    //TODO
    public void testTablero(){
        this.createTablero();
        while(this.getBolsaActual().size()>0){
            int i = (int)(Math.floor(Math.random()*14.999));
            int j = (int)(Math.floor(Math.random()*14.999));
            if(this.tablero[i][j].getLetraAsignada()!=null){
                continue;
            }
            this.tablero[i][j].setLetraAsignada(this.getBolsaActual().remove(0));
        }
    }
    
    public void imprimirTablero(){
        for(int i=0; i<15; i++){
            for(int j=0; j<15; j++){
                System.out.print("|"+this.tablero[i][j].toString());
            }
            System.out.println();
        }    
        
    }
    
    private LetraDataObject getLetraById(String id){

        return mapaLetras.get(id);
          
    }
    
    public static void main(String args[]){
        
        try{
        
            CrucigramaManager m = new CrucigramaManager();

            m.getNuevaBolsaLetras();
            m.createTablero();
            String input="";
            String[][] lista = new String[4][3];
            int i=0;
            do{
                input = JOptionPane.showInputDialog("colocar letra");
                if(input==null || input.equals("end")){
                    break;
                }
                lista[i] = input.split(",");

                //System.out.println(m.getLetrasAleatorias(Integer.parseInt(input)));
                //System.out.println("letras restantes : "+m.getBolsaActual().size());
                i++;
            }while(true);
            m.colocarLetras(lista);
            m.imprimirTablero();
            //System.out.println(m.getBolsaActual().size());
            //System.out.println(m.getBolsaActual());

            //m.testTablero();
            //m.imprimirTablero();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
